package com.ihr360.job.core.repeat.support;

import com.ihr360.job.core.item.ExecutionContext;
import com.ihr360.job.core.item.ItemStream;
import com.ihr360.job.core.item.ItemStreamException;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Simple {@link ItemStream} that delegates to a list of other streams.
 *
 * @author Dave Syer
 *
 */
public class CompositeItemStream implements ItemStream {

    private List<ItemStream> streams = new ArrayList<ItemStream>();

    /**
     * Public setter for the listeners.
     *
     * @param listeners
     */
    public void setStreams(ItemStream[] listeners) {
        this.streams = Arrays.asList(listeners);
    }

    /**
     * Register a {@link ItemStream} as one of the interesting providers under
     * the provided key.
     *
     */
    public void register(ItemStream stream) {
        synchronized (streams) {
            if (!streams.contains(stream)) {
                streams.add(stream);
            }
        }
    }

    /**
     *
     */
    public CompositeItemStream() {
        super();
    }

    /**
     * Simple aggregate {@link ExecutionContext} provider for the contributions
     * registered under the given key.
     *
     * @see org.springframework.batch.item.ItemStream#update(ExecutionContext)
     */
    @Override
    public void update(ExecutionContext executionContext) {
        for (ItemStream itemStream : streams) {
            itemStream.update(executionContext);
        }
    }

    /**
     * Broadcast the call to close.
     * @throws ItemStreamException
     */
    @Override
    public void close() throws ItemStreamException {
        for (ItemStream itemStream : streams) {
            itemStream.close();
        }
    }

    /**
     * Broadcast the call to open.
     * @throws ItemStreamException
     */
    @Override
    public void open(ExecutionContext executionContext) throws ItemStreamException {
        for (ItemStream itemStream : streams) {
            itemStream.open(executionContext);
        }
    }

}